
// 采用 function 关键字来定义 "类"
function Panda( id , name ){
    this.id = id ;
    this.name = name ;
}

// 通过 "类"名 来定义静态属性
Panda.school = '大熊猫学院' ;

// 定义原型属性
Panda.prototype.eat = function(food){
    console.log( `${this.name}正在吃${food}` );
}

// 创建 Panda "类" 的 实例 (instance)
let p = new Panda( 1001 , '小美' );
console.log( p );
p.eat( '竹子' );

console.log( p.hasOwnProperty( 'id' ) );
console.log( p.hasOwnProperty( 'name' ) );
console.log( p.hasOwnProperty( 'eat' ) ); // false

console.log( Object.getOwnPropertyNames( Panda ) );
console.log( Object.getOwnPropertyNames( Panda.prototype ) );
console.log( Object.getOwnPropertyNames( p ) );

console.log( Panda.school , p.school );

console.log( '- - - - - - - - - - - - - -' );

// 从 ES6 开始允许使用 class 关键字来定义 "类"
class Loong {
    // 被 static 修饰的属性就是静态属性
    static school = '飞龙学院';
    // 通过 constructor 定义构造方法
    constructor(id,name){
        this.id = id ;
        this.name = name ;
    }
    // 定义实例方法
    fly(){
        console.log( `${this.name}飞起来了`);
    }
}

// 创建 Loong "类" 的实例
let x = new Loong( 2002 , '敖广' );
console.log( x );
x.fly();

// Object.prototype.hasOwnProperty( name )
console.log( x.hasOwnProperty( 'id' ) );
console.log( x.hasOwnProperty( 'name' ) );
console.log( x.hasOwnProperty( 'fly' ) ); // false

console.log( Object.getOwnPropertyNames( Loong ) );
console.log( Object.getOwnPropertyNames( Loong.prototype ) );
console.log( Object.getOwnPropertyNames( x ) );

console.log( Loong.school , x.school );

// 实际上 getOwnPropertyNames 就是 Object "类" 中的 静态属性